home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 245_01 / lca23.c < prev    next >
Text File  |  1987-10-26  |  29KB  |  917 lines

  1.  
  2.  
  3. /* (2,3) Linear Cellular Automaton    */
  4.  
  5. /* Reference:                */
  6. /*                    */
  7. /*    Kenneth E. Perry            */
  8. /*    Abstract Mathematical Art        */
  9. /*    BYTE                */
  10. /*    December, 1986            */
  11. /*    pages 181-192            */
  12.  
  13. /*    Copyright (C) 1987        */
  14. /*    Harold V. McIntosh        */
  15. /*    Gerardo Cisneros S.        */
  16.  
  17. /* G. Cisneros, 4.3.87                        */
  18. /* 10 April 1987 - modified for (4,2) [HVM]            */
  19. /* 26 April 1987 - Multiple menus [HVM]                */
  20. /* 28 April 1987 - back modified to (4,1) [HVM]            */
  21. /* 28 April 1987 - version for XVI Feria de Puebla [HVM]    */
  22. /* 14 May 1987 - modified for (3,1) and general rule [HVM]    */
  23. /* 19 May 1987 - modified for (2,2)                */
  24. /* 20 May 1987 - modified for (2,3)                */
  25.  
  26. # include <bdos.h>
  27.  
  28. # define COLGRAF     4  /* graph resolution            */
  29. # define T80X25      3  /* text resolution            */
  30. # define WHCYMAG     1  /* color quad for normal screen        */
  31. # define AL        320  /* array length (screen width)        */
  32. # define TS         8    /* distinct sums w/totalistic rule    */
  33. # define DS        32  /* (number of distinct neighborhoods)/4    */
  34. # define KK         2  /* number of states per cell        */
  35. # define NX         14    /* number of sample rules        */
  36.  
  37. char xrule[NX][KK][KK][KK][KK][KK];
  38.  
  39. char ixrule[NX][DS]=
  40.  
  41.     "00AC324A8D30329A99A108A46C9FDCB7",    /* cycles on dgl bgrnd    */
  42.     "088686698669337E8669699E699E9EE7",    /* class iv - try vnts    */
  43.     "088E8CC78EAEE5888CC7E67FE7717118",    /* very complex gliders    */
  44.     "088E8EE78EE7E7798EE7E779E7797996",    /* Extrmly good varnts    */
  45.     "088071C431F94830C78A435E015198DC",
  46.  
  47.     "1008088608868669088686698669699E",    /* dominant triangles    */
  48.     "11000100000010110111001011001100",    /* flotsam & jetsam    */
  49.     "28CA858DC0500D0512AAA0BACBBB94B3",
  50.     "381E3AFA19D7CECBCE5867F7206F7B6E",    /* mottled        */
  51.     "4A1ADAD80AAC3E8E8AEE4D138308E0FB",    /* crossed gliders    */
  52.  
  53.     "88EF636569ABE6994C073A1FF3AC5EFE",    /*            */
  54.     "8A0FFA23E1FF8558675AFF0B53AD9FCB",    /* dislocatns & regns    */
  55.     "A3F73FA3A81F3F4AE4280DED0E317F1B",
  56.     "D2BF4202000000005CEDB7C000000000"    /* dislocation        */
  57.  
  58.     ;
  59.  
  60. char  xx[4], rule[DS+1], ascrule[KK][KK][KK][KK][KK][KK][KK];
  61. int   binrule[KK][KK][KK][KK][KK][KK][KK], arule[DS], arr1[AL], arr2[AL];
  62. char  trule[TS]="00000000";
  63.  
  64. main()
  65. {
  66. int  i, j, i0, i1, i2, i3, i4, i5, i6;
  67. int  more = 'r';
  68. char a, b, c;
  69.  
  70. for (i=0; i<NX; i++) {                    /* copy to 5-index array */
  71. i0=0; i1=0; i2=0; i3=0; i4=0;
  72. for (j=0; j<DS; j++) {
  73.   xrule[i][i0][i1][i2][i3][i4]=ixrule[i][j];
  74.   i4++;
  75.   if (i4==KK) {i4=0; i3++;};
  76.   if (i3==KK) {i3=0; i2++;};
  77.   if (i2==KK) {i2=0; i1++;};
  78.   if (i1==KK) {i1=0; i0++;};
  79.   if (i0==KK) {i0=0; };
  80. };};
  81.  
  82.  
  83.     videopalette(WHCYMAG);                /* white/cyan/magenta */
  84.  
  85.     tuto();
  86.     while (!kbdst()) rand();                /* wait for keypress */
  87.     kbdin();                        /* ignore it */
  88.     videomode(T80X25);
  89.     videoscroll(3,0,5,71,0,3);                /* menu on blue background */
  90.     videoscroll(19,0,24,71,0,3);
  91.     xtoasc(rand()%NX);
  92.     rule[DS]=0;
  93.     ranlin();                        /* random initial array */
  94.  
  95.     while (more!='n') {                    /* execute multiple runs */
  96.     rmenu();
  97.     lmenu();
  98.     while (0<1) {                    /* set up one run */
  99.     c=kbdin();
  100.     if (c=='g') break;                    /* go draw graph */
  101.     if (c=='q') more='n';                /* quit for good */
  102.     if (more=='n') break;
  103.     switch (c) {
  104.     case '@':                    /* numbered tot rule */
  105.         nutoto(numin(0));
  106.         totoasc();
  107.         rmenu();
  108.         videocursor(0,4,0);
  109.         break;
  110.     case '$':                    /* dozen totalistics */
  111.         j=numin(0);
  112.         for (i=0; i<12; i++) {
  113.           nutoto(j+i);
  114.           totoasc();
  115.           ranlin();
  116.           evolve(rule);
  117.           };
  118.         videomode(T80X25);
  119.         rmenu();
  120.         lmenu();
  121.         break;
  122.     case 't':                    /* totalistic rule */
  123.         xblnk();
  124.         tmenu();
  125.         edtrule();
  126.         totoasc();
  127.         for (i0=0; i0<KK; i0++) {
  128.         for (i1=0; i1<KK; i1++) {
  129.         for (i2=0; i2<KK; i2++) {
  130.         for (i3=0; i3<KK; i3++) {
  131.         for (i4=0; i4<KK; i4++) {
  132.         for (i5=0; i5<KK; i5++) {
  133.         for (i6=0; i6<KK; i6++) {
  134.         ascrule[i0][i1][i2][i3][i4][i5][i6]=trule[i0+i1+i2+i3+i4+i5+i6];
  135.         };};};};};};};
  136.         videocursor(0,4,0);
  137.         rmenu();
  138.         xmenu(totonu(0));
  139.         break;
  140.         case 'r':                    /* edit rule */    
  141.         xblnk();
  142.         edrule();
  143.         videocursor(0,4,0);
  144.         rmenu();
  145.         break;
  146.         case 'l':                    /* edit cell string */
  147.         xblnk();
  148.         edline();
  149.         videocursor(0,3,0);
  150.         lmenu();
  151.         break;
  152.         case '#':                    /* read stored rule */
  153.         xmenu(NX);
  154.         xtoasc(lim(1,numin(0),NX)-1);
  155.         rmenu();
  156.             break;
  157.     case 'D':                    /* run through samples */
  158.         for (i=0; i<NX; i++) {
  159.           xmenu(i);
  160.           xtoasc(i);
  161.           ranlin();
  162.           evolve(rule);
  163.           };
  164.         videomode(T80X25);
  165.         rmenu();
  166.         break;
  167.         case 'u':                    /* sparse init arry */
  168.         xblnk();
  169.         for (i=0; i<AL; i++) arr1[i]=0;
  170.         arr1[AL/4]=1;
  171.             arr1[AL/2]=1;
  172.             arr1[(3*AL)/4]=1;
  173.             arr1[(3*AL)/4+2]=1;
  174.         lmenu();
  175.             break;
  176.     case 'x':                    /* random rule */
  177.         xblnk();
  178.         for (i0=0; i0<KK; i0++) {
  179.         for (i1=0; i1<KK; i1++) {
  180.         for (i2=0; i2<KK; i2++) {
  181.         for (i3=0; i3<KK; i3++) {
  182.         for (i4=0; i4<KK; i4++) {
  183.         for (i5=0; i5<KK; i5++) {
  184.         for (i6=0; i6<KK; i6++) {
  185.           if (i4 == 0) i=rand();
  186.           ascrule[i0][i1][i2][i3][i4][i5][i6]='0'+i%2;
  187.           i/=2;
  188.         };};};};};};};
  189.         rmenu();
  190.         break;
  191.     case 'y':                    /* random line */
  192.         xblnk();
  193.         ranlin();
  194.             lmenu();
  195.         break;
  196.     case 'Y':                    /* symmetrize rule */
  197.         for (i0=0; i0<KK; i0++) {
  198.         for (i1=0; i1<KK; i1++) {
  199.         for (i2=0; i2<KK; i2++) {
  200.         for (i3=0; i3<KK; i3++) {
  201.         for (i4=0; i4<KK; i4++) {
  202.         for (i5=0; i5<KK; i5++) {
  203.         for (i6=0; i6<KK; i6++) {
  204.         ascrule[i6][i5][i4][i3][i2][i1][i0]=ascrule[i0][i1][i2][i3][i4][i5][i6];      
  205.         };};};};};};};
  206.         break;
  207.     case 'B':                    /* begin barrier */
  208.         a=kbdin();
  209.         b=kbdin();
  210.         ascrule[0][0][0][0][0][a-'0'][b-'0']=a;
  211.         ascrule[0][0][1][0][0][a-'0'][b-'0']=a;
  212.         ascrule[0][0][2][0][0][a-'0'][b-'0']=a;
  213.         rmenu();
  214.         break;
  215.     case 'E':                    /* end barrier */
  216.         a=kbdin();
  217.         b=kbdin();
  218.         ascrule[0][0][0][0][a-'0'][b-'0'][0]=b;
  219.         ascrule[0][0][0][0][a-'0'][b-'0'][1]=b;
  220.         ascrule[0][0][0][0][a-'0'][b-'0'][2]=b;
  221.         rmenu();
  222.         break;
  223.     case 'L':                    /* left glider link */
  224.         a=kbdin();
  225.         b=kbdin();
  226.         c=kbdin();
  227.         ascrule[0][0][0][0][a-'0'][b-'0'][c-'0']=c;
  228.         rmenu();
  229.         break;
  230.     case 'R':                    /* left glider link */
  231.         a=kbdin();
  232.         b=kbdin();
  233.         c=kbdin();
  234.         ascrule[0][0][0][0][a-'0'][b-'0'][c-'0']=a;
  235.         rmenu();
  236.         break;
  237.     case 'S':                    /* still life link */
  238.         a=kbdin();
  239.         b=kbdin();
  240.         c=kbdin();
  241.         ascrule[0][0][0][0][a-'0'][b-'0'][c-'0']=b;
  242.         rmenu();
  243.         break;
  244.     case '=':
  245.         for (i=1; i<8;  i++) {
  246.         for (j=0; j<40; j++) arr1[40*i+j]=arr1[j];};
  247.         lmenu();
  248.         break;
  249.     case '~':
  250.         for (i=1; i<16;  i++) {
  251.         for (j=0; j<20; j++) arr1[20*i+j]=arr1[j];};
  252.         lmenu();
  253.         break;
  254.         default: break;
  255.         };
  256.     };
  257.     if (more=='n') break;
  258.     do {
  259.     evolve(rule);
  260.     videocursor(0,0,0);
  261.     scrstr("?");
  262.     videocursor(0,0,34);
  263.     scrstr("y/n/cr");
  264.     more=kbdin();
  265.     } while (more=='\015');
  266.     videomode(T80X25);                    /* reset the screen */
  267.     if (more=='n') break;
  268.     };
  269.   videomode(T80X25);}    
  270.  
  271. /* edit the rule */
  272. edrule() {
  273. char c;
  274. int  i, i0, i1, i2, i3, i4;
  275.  
  276. i=6; i0=0; i1=0; i2=0; i3=0; i4=0;
  277.     while (0<1) {
  278.         videocursor(0,3,i);
  279.         c = kbdin();
  280.         if (c == '\015') break;                /* carriage return exits */
  281.         switch (c) {
  282.         case '0':                    /* state */
  283.         ascrule[i0][i1][i2][i3][i4][0][0]='0';
  284.         ascrule[i0][i1][i2][i3][i4][0][1]='0';
  285.         ascrule[i0][i1][i2][i3][i4][1][0]='0';
  286.         ascrule[i0][i1][i2][i3][i4][1][1]='0';
  287.             i4++;
  288.         if (i4==KK) {i4=0; i3++;};
  289.         if (i3==KK) {i3=0; i2++;};
  290.         if (i2==KK) {i2=0; i1++;};
  291.         if (i1==KK) {i1=0; i0++;};
  292.         if (i0==KK) {i0=0; };
  293.             videocattr(0,c,3,1);
  294.             if (i<6+DS) i++;
  295.